8. ABI 摘要(ABI v0.1)
完整定义见本目录「Shader ABI」各章。
- 代码对象:shader 为位置无关代码(PC = 相对
CODE_BASE的 32 位偏移)。编译器输出前导/主体/尾声三个可选段,驱动 memcpy 拼接为一个代码对象(8-byte 指令对齐、段起始 16-byte 对齐),前段末尾直接落入下段,无隐式跳转;jal链接值 = PC+4。段元数据含 ISA/ABI 版本、入口偏移、代码长度、v/u 上界、scratch 字节数、描述符集合、waitcnt 上界与可选能力;驱动提交前检查,不支持的optional指令不得静默执行。 - 入口状态:
u0:u1根表指针;u2–u9descriptor set 0–3 基址;u10–u25前 16 个 dword push constants;u26–u28workgroup id;u29subgroup/warp id;u30–u31驱动保留(须声明);v0= compute packed local id(10:10:10)。fragment:v0像素 xy、v1coverage、v2sample id/front-facing、v3primitive id。 - 调用约定:caller-saved
v0–v31、u16–u31;callee-savedv32–v127、u32–u59(返回前恢复);u60ABI/驱动 scratch、u61保留;u62= 返回地址(jal/jalr推荐rd=u62)、u63= 当前帧 scratch 字节偏移(不得当全局指针)。64 位对偶数对齐,保存规则对两半同时适用。被调用者不得假设 EXEC 全 1;返回前须清空本函数发起的异步队列(或等价waitcnt)。 - scratch 与描述符:每 lane scratch 为私有字节数组(基址
scratch_lo/hi,u63帧偏移);spill/局部数组 16-byte 对齐;越界按 bounds_checked 规则。描述符指针须满足udesc4/udesc8对齐;null/OOB load 返回全零(可返回 residency code),store/atomic 丢弃;非一致 descriptor index 必须由编译器 waterfall。 - 段接口:VS 前导输出的属性从
v8起、每 location 连续 4 寄存器;FS 尾声读 render target i 的 RGBA 于v[4i..4i+3]、深度v32、模板v33、sample maskv34。段边界不改变寄存器文件、EXEC、MODE、fflags 或 pending waitcnt;段间只经约定寄存器传值。 - 并发与版本:函数返回不得遗留未完成异步副作用(store 等
vst、load/返回原子等vm/tex、SFU 等sfu);workgroup 屏障由调用者保证全部活跃 warp 到达。trap 现场含段编号、拼接后 PC、EXEC 与 scratch 指针。对象头写abi_version=0.1、isa_version=0.1;旧驱动遇到未知 flag、optional 能力或非零保留字段必须拒绝对象。